#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
AI营销方案生成系统 - 开发环境启动脚本

功能说明：
- 开发环境应用启动入口
- 支持热重载和调试模式
- 自动加载环境变量
- 提供启动参数配置

使用方法：
    python run.py                    # 默认配置启动
    python run.py --host 0.0.0.0     # 指定主机
    python run.py --port 8000        # 指定端口
    python run.py --debug            # 启用调试模式
    python run.py --no-reload        # 禁用热重载

Author: AI Marketing System
Date: 2024
"""

import os
import sys
import argparse
from pathlib import Path

# 添加项目根目录到Python路径
project_root = Path(__file__).parent
sys.path.insert(0, str(project_root))

# 加载环境变量
from dotenv import load_dotenv

# 优先加载.env文件，如果不存在则使用.env.example
env_file = project_root / '.env'
if not env_file.exists():
    env_file = project_root / '.env.example'
    print(f"警告: .env文件不存在，使用 {env_file} 作为默认配置")
    print("建议: 复制 .env.example 为 .env 并根据实际环境修改配置")

load_dotenv(env_file)

# 导入应用
from app import create_app
from config.settings import get_config_by_name


def parse_arguments():
    """
    解析命令行参数
    """
    parser = argparse.ArgumentParser(
        description='AI营销方案生成系统开发服务器',
        formatter_class=argparse.RawDescriptionHelpFormatter,
        epilog="""
示例:
  python run.py                    # 使用默认配置启动
  python run.py --host 0.0.0.0     # 允许外部访问
  python run.py --port 8000        # 使用8000端口
  python run.py --debug            # 启用调试模式
  python run.py --env production   # 使用生产环境配置
        """
    )
    
    parser.add_argument(
        '--host',
        default=os.getenv('HOST', '127.0.0.1'),
        help='服务器主机地址 (默认: 127.0.0.1)'
    )
    
    parser.add_argument(
        '--port',
        type=int,
        default=int(os.getenv('PORT', 5000)),
        help='服务器端口 (默认: 5000)'
    )
    
    parser.add_argument(
        '--debug',
        action='store_true',
        default=os.getenv('DEBUG', 'false').lower() == 'true',
        help='启用调试模式'
    )
    
    parser.add_argument(
        '--no-reload',
        action='store_true',
        default=False,
        help='禁用热重载'
    )
    
    parser.add_argument(
        '--env',
        choices=['development', 'testing', 'production'],
        default=os.getenv('FLASK_ENV', 'development'),
        help='运行环境 (默认: development)'
    )
    
    parser.add_argument(
        '--workers',
        type=int,
        default=1,
        help='工作进程数量 (仅在生产模式下有效)'
    )
    
    return parser.parse_args()


def check_environment():
    """
    检查运行环境
    """
    print("=" * 60)
    print("AI营销方案生成系统 - 开发服务器")
    print("=" * 60)
    
    # 检查Python版本
    python_version = sys.version_info
    if python_version < (3, 8):
        print(f"错误: Python版本过低 ({python_version.major}.{python_version.minor})")
        print("要求: Python 3.8 或更高版本")
        sys.exit(1)
    
    print(f"Python版本: {python_version.major}.{python_version.minor}.{python_version.micro}")
    
    # 检查必要的环境变量
    required_env_vars = [
        'SECRET_KEY',
        'MONGODB_HOST',
        'REDIS_HOST'
    ]
    
    missing_vars = []
    for var in required_env_vars:
        if not os.getenv(var):
            missing_vars.append(var)
    
    if missing_vars:
        print(f"警告: 缺少环境变量: {', '.join(missing_vars)}")
        print("建议: 检查 .env 文件配置")
    
    # 检查配置文件
    config_name = os.getenv('FLASK_ENV', 'development')
    try:
        config = get_config_by_name(config_name)
        print(f"配置环境: {config_name}")
        print(f"调试模式: {config.DEBUG}")
    except Exception as e:
        print(f"错误: 配置加载失败 - {e}")
        sys.exit(1)
    
    print("-" * 60)


def main():
    """
    主函数
    """
    # 解析命令行参数
    args = parse_arguments()
    
    # 检查环境
    check_environment()
    
    # 设置环境变量
    os.environ['FLASK_ENV'] = args.env
    
    try:
        # 创建应用实例
        app, socketio = create_app(args.env)
        
        if not app:
            print("❌ 应用创建失败")
            sys.exit(1)
        
        print(f"✅ 应用创建成功 - 环境: {args.env}")
        
        # 运行应用
        try:
            if args.debug:
                print(f"🚀 启动开发服务器...")
                print(f"📍 地址: http://{args.host}:{args.port}")
                print(f"🔧 调试模式: {args.debug}")
                print(f"⚡ 热重载: 启用")
                print("\n按 Ctrl+C 停止服务器\n")
                
                # 开发环境使用Flask-SocketIO运行
                socketio.run(
                    app,
                    host=args.host,
                    port=args.port,
                    debug=args.debug,
                    use_reloader=True,
                    log_output=True
                )
            else:
                print(f"🚀 启动生产服务器...")
                print(f"📍 地址: http://{args.host}:{args.port}")
                print(f"👥 工作进程: {args.workers}")
                print("\n建议使用 gunicorn 运行生产环境:")
                print(f"gunicorn --worker-class eventlet -w {args.workers} --bind {args.host}:{args.port} app:app")
                print("\n按 Ctrl+C 停止服务器\n")
                
                # 生产环境建议使用gunicorn
                app.run(
                    host=args.host,
                    port=args.port,
                    debug=False,
                    threaded=True
                )
        
        except KeyboardInterrupt:
            print("\n服务器已停止")
        except Exception as e:
            print(f"启动失败: {e}")
            if args.debug:
                import traceback
                traceback.print_exc()
            sys.exit(1)
    except KeyboardInterrupt:
        print("\n服务器已停止")
    except Exception as e:
        print(f"启动失败: {e}")
        if args.debug:
            import traceback
            traceback.print_exc()
        sys.exit(1)


if __name__ == '__main__':
    main()